package com.pro.common.service.service;

import com.pro.common.api.exception.BusinessException;

import java.math.BigDecimal;

/**
 * 字典枚举
 */
//@RefreshScope
public interface IEnumAuthDict {
    String name();

    default String getValueCache() {
        return CommonPropertiesService.INSTANCE.getCommonProperties().getAuthDictMap().get(this.name());
    }

    default Boolean getBoolean() {
        String value = getValueCache();
        return "1".equals(value);
    }

    default BigDecimal getBigDecimal() {
        String value = getValueCache();
        return null != value ? new BigDecimal(value) : BigDecimal.ZERO;
    }

    default Integer getInteger() {
        String value = getValueCache();
        return null != value ? Integer.parseInt(value) : 0;
    }

    default Long getLong() {
        String value = getValueCache();
        return null != value ? Long.parseLong(value) : 0L;
    }

    //    default String getValueDb() {
//        return AuthDictUtil.getValue(this);
//    }
    //    default <T> T getValueCacheOrDefault(T t) {
//        return AuthDictUtil.getValueCacheOrDefault(this, t);
//    }
    default <T> T getValueCacheOrDefault(T defaultVal) {
        assert defaultVal != null;
        String valueStr = this.getValueCache();
        return toType(valueStr, defaultVal);
    }

    @SuppressWarnings("unchecked")
    private static <T> T toType(String valueStr, T defaultVal) {
        if (null == valueStr || valueStr.isEmpty()) {
            return defaultVal;
        }
        if (defaultVal instanceof Integer) {
            return (T) Integer.valueOf(valueStr);
        } else if (defaultVal instanceof BigDecimal) {
            return (T) new BigDecimal(valueStr);
        } else if (defaultVal instanceof Long) {
            return (T) Long.valueOf(valueStr);
        } else if (defaultVal instanceof Double) {
            return (T) Double.valueOf(valueStr);
        } else if (defaultVal instanceof String) {
            return (T) valueStr;
        } else if (defaultVal instanceof Boolean) {
            return (T) (Boolean) "1".equals(valueStr);
        }
        throw new BusinessException("未知类型_", defaultVal.getClass());
    }


    Boolean getShowAdmin();

    Boolean getShowUser();
}
